home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Tools 2
/
Amiga Tools 2.iso
/
tools
/
vim
/
src
/
digraph.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-09
|
8KB
|
361 lines
/* vi:ts=4:sw=4
*
* VIM - Vi IMproved by Bram Moolenaar
*
* Read the file "credits.txt" for a list of people who contributed.
* Read the file "uganda.txt" for copying and usage conditions.
*/
#ifdef DIGRAPHS
/*
* digraph.c: code for digraphs
*/
#include "vim.h"
#include "globals.h"
#include "proto.h"
#include "param.h"
static void printdigraph __ARGS((char_u *));
char_u (*digraphnew)[3]; /* pointer to added digraphs */
int digraphcount = 0; /* number of added digraphs */
#ifdef MSDOS
char_u digraphdefault[][3] = /* standard MSDOS digraphs */
{{'C', ',', 128}, /* */
{'u', '"', 129}, /* */
{'e', '\'', 130}, /* */
{'a', '^', 131}, /* */
{'a', '"', 132}, /* */
{'a', '`', 133}, /* */
{'a', '@', 134}, /* */
{'c', ',', 135}, /* ~G (SAS C can't handle the real char) */
{'e', '^', 136}, /* ~H (SAS C can't handle the real char) */
{'e', '"', 137}, /* */
{'e', '`', 138}, /* */
{'i', '"', 139}, /* */
{'i', '^', 140}, /* */
{'i', '`', 141}, /* */
{'A', '"', 142}, /* */
{'A', '@', 143}, /* */
{'E', '\'', 144}, /* */
{'a', 'e', 145}, /* */
{'A', 'E', 146}, /* */
{'o', '^', 147}, /* */
{'o', '"', 148}, /* */
{'o', '`', 149}, /* */
{'u', '^', 150}, /* */
{'u', '`', 151}, /* */
{'y', '"', 152}, /* */
{'O', '"', 153}, /* */
{'U', '"', 154}, /* */
{'c', '|', 155}, /* */
{'$', '$', 156}, /* */
{'Y', '-', 157}, /* ~] (SAS C can't handle the real char) */
{'P', 't', 158}, /* */
{'f', 'f', 159}, /* */
{'a', '\'', 160}, /* */
{'i', '\'', 161}, /* ¡ */
{'o', '\'', 162}, /* ¢ */
{'u', '\'', 163}, /* xx (SAS C can't handle the real char) */
{'n', '~', 164}, /* ¤ */
{'N', '~', 165}, /* ¥ */
{'a', 'a', 166}, /* ¦ */
{'o', 'o', 167}, /* § */
{'~', '?', 168}, /* ¨ */
{'-', 'a', 169}, /* © */
{'a', '-', 170}, /* ª */
{'1', '2', 171}, /* « */
{'1', '4', 172}, /* ¬ */
{'~', '!', 173}, /* */
{'<', '<', 174}, /* ® */
{'>', '>', 175}, /* ¯ */
{'s', 's', 225}, /* á */
{'j', 'u', 230}, /* æ */
{'o', '/', 237}, /* í */
{'+', '-', 241}, /* ñ */
{'>', '=', 242}, /* ò */
{'<', '=', 243}, /* ó */
{':', '-', 246}, /* ö */
{'~', '~', 247}, /* ÷ */
{'~', 'o', 248}, /* ø */
{'2', '2', 253}, /* ý */
{NUL, NUL, NUL}
};
#else /* MSDOS */
char_u digraphdefault[][3] = /* standard ISO digraphs */
{{'~', '!', 161}, /* ¡ */
{'c', '|', 162}, /* ¢ */
{'$', '$', 163}, /* £ */
{'o', 'x', 164}, /* ¤ */
{'Y', '-', 165}, /* ¥ */
{'|', '|', 166}, /* ¦ */
{'p', 'a', 167}, /* § */
{'"', '"', 168}, /* ¨ */
{'c', 'O', 169}, /* © */
{'a', '-', 170}, /* ª */
{'<', '<', 171}, /* « */
{'-', ',', 172}, /* ¬ */
{'-', '-', 173}, /* */
{'r', 'O', 174}, /* ® */
{'-', '=', 175}, /* ¯ */
{'~', 'o', 176}, /* ° */
{'+', '-', 177}, /* ± */
{'2', '2', 178}, /* ² */
{'3', '3', 179}, /* ³ */
{'\'', '\'', 180}, /* ´ */
{'j', 'u', 181}, /* µ */
{'p', 'p', 182}, /* ¶ */
{'~', '.', 183}, /* · */
{',', ',', 184}, /* ¸ */
{'1', '1', 185}, /* ¹ */
{'o', '-', 186}, /* º */
{'>', '>', 187}, /* » */
{'1', '4', 188}, /* ¼ */
{'1', '2', 189}, /* ½ */
{'3', '4', 190}, /* ¾ */
{'~', '?', 191}, /* ¿ */
{'A', '`', 192}, /* À */
{'A', '\'', 193}, /* Á */
{'A', '^', 194}, /* Â */
{'A', '~', 195}, /* Ã */
{'A', '"', 196}, /* Ä */
{'A', '@', 197}, /* Å */
{'A', 'E', 198}, /* Æ */
{'C', ',', 199}, /* Ç */
{'E', '`', 200}, /* È */
{'E', '\'', 201}, /* É */
{'E', '^', 202}, /* Ê */
{'E', '"', 203}, /* Ë */
{'I', '`', 204}, /* Ì */
{'I', '\'', 205}, /* Í */
{'I', '^', 206}, /* Î */
{'I', '"', 207}, /* Ï */
{'D', '-', 208}, /* Ð */
{'N', '~', 209}, /* Ñ */
{'O', '`', 210}, /* Ò */
{'O', '\'', 211}, /* Ó */
{'O', '^', 212}, /* Ô */
{'O', '~', 213}, /* Õ */
{'O', '"', 214}, /* Ö */
{'/', '\\', 215}, /* × */
{'O', '/', 216}, /* Ø */
{'U', '`', 217}, /* Ù */
{'U', '\'', 218}, /* Ú */
{'U', '^', 219}, /* Û */
{'U', '"', 220}, /* Ü */
{'Y', '\'', 221}, /* Ý */
{'I', 'p', 222}, /* Þ */
{'s', 's', 223}, /* ß */
{'a', '`', 224}, /* à */
{'a', '\'', 225}, /* á */
{'a', '^', 226}, /* â */
{'a', '~', 227}, /* ã */
{'a', '"', 228}, /* ä */
{'a', '@', 229}, /* å */
{'a', 'e', 230}, /* æ */
{'c', ',', 231}, /* ç */
{'e', '`', 232}, /* è */
{'e', '\'', 233}, /* é */
{'e', '^', 234}, /* ê */
{'e', '"', 235}, /* ë */
{'i', '`', 236}, /* ì */
{'i', '\'', 237}, /* í */
{'i', '^', 238}, /* î */
{'i', '"', 239}, /* ï */
{'d', '-', 240}, /* ð */
{'n', '~', 241}, /* ñ */
{'o', '`', 242}, /* ò */
{'o', '\'', 243}, /* ó */
{'o', '^', 244}, /* ô */
{'o', '~', 245}, /* õ */
{'o', '"', 246}, /* ö */
{':', '-', 247}, /* ÷ */
{'o', '/', 248}, /* ø */
{'u', '`', 249}, /* ù */
{'u', '\'', 250}, /* ú */
{'u', '^', 251}, /* û */
{'u', '"', 252}, /* ü */
{'y', '\'', 253}, /* ý */
{'i', 'p', 254}, /* þ */
{'y', '"', 255}, /* ÿ */
{NUL, NUL, NUL}
};
#endif /* MSDOS */
/*
* handle digraphs after typing a character
*/
int
dodigraph(c)
int c;
{
static int backspaced; /* character before BS */
static int lastchar; /* last typed character */
if (c == -1) /* init values */
{
backspaced = -1;
}
else if (p_dg)
{
if (backspaced >= 0)
c = getdigraph(backspaced, c, FALSE);
backspaced = -1;
if (c == BS && lastchar >= 0)
backspaced = lastchar;
}
lastchar = c;
return c;
}
/*
* lookup the pair char1, char2 in the digraph tables
* if no match, return char2
*/
int
getdigraph(char1, char2, meta)
int char1;
int char2;
int meta;
{
int i;
int retval;
retval = 0;
for (i = 0; ; ++i) /* search added digraphs first */
{
if (i == digraphcount) /* end of added table, search defaults */
{
for (i = 0; digraphdefault[i][0] != 0; ++i)
if (digraphdefault[i][0] == char1 && digraphdefault[i][1] == char2)
{
retval = digraphdefault[i][2];
break;
}
break;
}
if (digraphnew[i][0] == char1 && digraphnew[i][1] == char2)
{
retval = digraphnew[i][2];
break;
}
}
if (retval == 0) /* digraph deleted or not found */
{
if (char1 == ' ' && meta) /* <space> <char> --> meta-char */
return (char2 | 0x80);
return char2;
}
return retval;
}
/*
* put the digraphs in the argument string in the digraph table
* format: {c1}{c2} char {c1}{c2} char ...
*/
void
putdigraph(str)
char_u *str;
{
int char1, char2, n;
char_u (*newtab)[3];
int i;
while (*str)
{
skipspace(&str);
if ((char1 = *str++) == 0 || (char2 = *str++) == 0)
return;
if (char1 == ESC || char2 == ESC)
{
EMSG("Escape not allowed in digraph");
return;
}
skipspace(&str);
if (!isdigit(*str))
{
emsg(e_number);
return;
}
n = getdigits(&str);
if (digraphnew) /* search the table for existing entry */
{
for (i = 0; i < digraphcount; ++i)
if (digraphnew[i][0] == char1 && digraphnew[i][1] == char2)
{
digraphnew[i][2] = n;
break;
}
if (i < digraphcount)
continue;
}
newtab = (char_u (*)[3])alloc(digraphcount * 3 + 3);
if (newtab)
{
memmove((char *)newtab, (char *)digraphnew, (size_t)(digraphcount * 3));
free(digraphnew);
digraphnew = newtab;
digraphnew[digraphcount][0] = char1;
digraphnew[digraphcount][1] = char2;
digraphnew[digraphcount][2] = n;
++digraphcount;
}
}
}
void
listdigraphs()
{
int i;
printdigraph(NULL);
msg_start();
msg_outchar('\n');
for (i = 0; digraphdefault[i][0] && !got_int; ++i)
{
if (getdigraph(digraphdefault[i][0], digraphdefault[i][1], FALSE) == digraphdefault[i][2])
printdigraph(digraphdefault[i]);
breakcheck();
}
for (i = 0; i < digraphcount && !got_int; ++i)
{
printdigraph(digraphnew[i]);
breakcheck();
}
msg_outchar('\n');
wait_return(TRUE); /* clear screen, because some digraphs may be wrong,
* in which case we messed up NextScreen */
}
static void
printdigraph(p)
char_u *p;
{
char_u buf[9];
static int len;
if (p == NULL)
len = 0;
else if (p[2] != 0)
{
if (len > Columns - 11)
{
msg_outchar('\n');
len = 0;
}
if (len)
msg_outstr((char_u *)" ");
sprintf((char *)buf, "%c%c %c %3d", p[0], p[1], p[2], p[2]);
msg_outstr(buf);
len += 11;
}
}
#endif /* DIGRAPHS */